package com.cskaoyan.javase.oop2._2polymorphic._0introduction;

/**
 * @description: 多态的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 什么是多态?
 * 某同一个事物，在不同的时刻/情况表现出不同的状态
 * 在java当中,多态指的是:
 *      同一种事物: 同一个引用(父类的引用)
 *      不同的情况: 指向不同的对象(不同的子类对象)
 *      不同的状态: 调用同名方法会体现出不同的行为
 *
 * 总结一下多态发生的条件:
 *      1.必须存在继承,多态一定发生在父子类之间
 *      2.必须存在方法重写,不同的子类需要重写父类中的同名方法
 *      3.必须存在父类引用指向子类对象
 *
 * 总结一下不能发生多态的场景:
 *      1.不能继承的类,final修饰的类
 *      2.不能重写的方法,final修饰的方法,static方法,private方法,构造方法
 *      3.必须写代码用父类引用指向子类对象
 *
 */
public class Demo {
    public static void main(String[] args) {
        //父类引用
        Animal a;
        //指向不同的子类对象
        a = new Dog();
        a.eat();
        a = new Cat();
        a.eat();
    }
}

class Animal {
    public void eat() {
        System.out.println("吃饭");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("吃老鼠");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("吃骨头");
    }
}